#pragma once
#include <iostream>

#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>

#include <cstring>

namespace YZC
{
    class udpClient
    {
    public:
        udpClient(const std::string &ip, uint16_t port)
            : _ip(ip), _port(port) {}

        void init()
        {
            // 1.socket创建套接字,udp需要使用 报文
            _sockfd = socket(AF_INET, SOCK_DGRAM, 0);
            if (_sockfd < 0)
            {
                perror("socket");
                exit(errno);
            }
            printf("client socket success\n");

            // bind由OS自行决定
        }

        void start()
        {
            // 发送数据，需要指定对方的ip和端口
            struct sockaddr_in serveraddr;
            memset(&serveraddr, 0, sizeof(serveraddr));

            // 设置ip/端口/通信等信息。注意转化为大端数据
            serveraddr.sin_family = AF_INET;
            serveraddr.sin_addr.s_addr = inet_addr(_ip.c_str());
            serveraddr.sin_port = htons(_port);

            socklen_t clientaddrlen = sizeof(serveraddr);

            // 可以发送数据
            char buffer[1024];
            while (true)
            {
                memset(buffer, 0, sizeof(buffer));
                printf("des ip port[%s][%d]", _ip.c_str(), _port);
                std::cout << "请输入你想要向server发送的数据;";
                std::cin >> buffer;
                int count = sendto(_sockfd, buffer, strlen(buffer), 0, (struct sockaddr *)&serveraddr, clientaddrlen);
                if (count <= 0)
                {
                    printf("数据发送异常,client quit\n");
                    close(_sockfd);
                    exit(-1);
                }
                printf("数据发送成功\n");
            }
        }

    private:
        int _sockfd; // 监听套接字

        std::string _ip; // ip
        uint16_t _port;  // 绑定的端口
    };
}
